package DAOs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import supermercadoGrupal.Factura;
import supermercadoGrupal.Producto;
import supermercadoGrupal.RenglonFactura;

public class FacturaDAO {

	private static final FacturaDAO instance = new FacturaDAO();
	private Connection connection;

	private FacturaDAO() {
		try {
			this.connection = DriverManager
					.getConnection("jdbc:mysql://localhost/supermercado?user=root");
		} catch (SQLException e) {
			throw new RuntimeException("Error al acceder a la db", e);
		}
	}

	public static FacturaDAO getInstance() {
		return FacturaDAO.instance;
	}

	public void agregar(Factura factura) throws SQLException {

		// Crear la consulta
		String sql = "INSERT INTO factura (valor, fecha) VALUES (?, ?)";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setFloat(1, factura.getValor());
		pSt.setDate(2, new java.sql.Date(factura.getFecha().getTime()));

		// Inserto el registro
		pSt.execute();

		// Hago otra consulta para obtener el id del registro creado
		ResultSet rs = pSt.getGeneratedKeys();
		rs.next();
		int id = rs.getInt(1);
		rs.close();

		pSt.close();

		factura.setNumero(id);

		// Inserto los renglones
		agregarRenglones(factura);

	}

	private void agregarRenglones(Factura factura) throws SQLException {

		for (RenglonFactura renglon : factura.getRenglones()) {

			String sql = "INSERT INTO renglon_factura (id_factura, id_producto, cantidad, precio) VALUES (?, ?, ?, ?)";
			PreparedStatement pSt = this.connection.prepareStatement(sql);

			pSt.setInt(1, factura.getNumero());
			pSt.setInt(2, renglon.getProducto().getId());
			pSt.setInt(3, renglon.getCantidad());
			pSt.setFloat(4, renglon.getPrecio_unitario());

			pSt.execute();

			pSt.close();
		}
	}

	public Factura findByNumero(int numeroFactura) throws SQLException{
		

		String sql = "SELECT numero,valor FROM factura as f WHERE f.numero=?";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setInt(1, numeroFactura);

		pSt.execute();

		ResultSet rs = pSt.getResultSet();
		if (!rs.next()) {
			return null;
		}
		Factura factura = new Factura(rs.getInt(1), rs.getFloat(2));

		pSt.close();

		// Recupero los renglones
		findRenglones(factura);

		return factura;
	}

	public List<Factura> findByFecha(Date fecha) throws SQLException {

		String sql = "SELECT numero,valor FROM factura f WHERE f.fecha=?";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setDate(1, new java.sql.Date(fecha.getTime()));

		pSt.execute();

		ResultSet rs = pSt.getResultSet();
		if (!rs.next()) {
			return null;
		}

		List<Factura> listaFacturas = new ArrayList<Factura>();
		do {
			Factura factura = new Factura(rs.getInt(1), rs.getFloat(2));
			// Recupero los renglones
			findRenglones(factura);

			listaFacturas.add(factura);
		} while (rs.next());

		pSt.close();

		return listaFacturas;
	}

	private void findRenglones(Factura factura) throws SQLException {

		String sql = "SELECT * FROM renglon_factura WHERE id_factura = ?";
		PreparedStatement pSt = this.connection.prepareStatement(sql);

		pSt.setInt(1, factura.getNumero());

		pSt.execute();

		ResultSet rs = pSt.getResultSet();

		while (rs.next()) {
			Producto producto = Producto.findById(rs.getInt(2));
			RenglonFactura renglon = new RenglonFactura(producto, rs.getInt(3),	rs.getFloat(4));
			factura.addRenglon(renglon);
		}

		pSt.close();
	}
}
